#include "Basket.h"
/**
 * @brief 将购物篮的内容逐项打印成清单，返回购物篮中所有物品的总价格
 * 
 * @param os 
 * @return double 
 */
double Basket::total_receipt(std::ostream &os) const
{
    double sum = 0.0; // 保存实时计算出的总价格
    // iter 指向 ISBN 相同的一批元素中的第一个
    // upper_bound 返回一个迭代器，该迭代器指向这批元素的尾后位置
    for(auto iter = items.cbegin(); iter != items.cend(); iter = items.upper_bound(*iter))
    {
        // 我们知道在当前的 Basket 中至少有一个该关键字的元素
        // 打印该书籍对应的项目
        sum += print_total(os, **iter, items.count(*iter));
    }
    os << "Total Sale: " << sum << std::endl; // 打印最终的总价格
    return sum;
}
/**
 * @brief 拷贝给定对象
 * 
 * @param sale 
 */
void Basket::add_item(const Quote& sale)
{
    items.insert(std::shared_ptr<Quote>(sale.clone()));
}
/**
 * @brief 移动给定对象
 * 
 * @param sale 
 */
void Basket::add_item(Quote&& sale)
{
    items.insert(std::shared_ptr<Quote>(std::move(sale).clone()));
}